코딩테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 스쿨
[ 템플릿 코드 ]
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
return answer;
}[ 풀이 ]
#include <string>
using namespace std;
int solution(string s)
{
string answer = "";
string temp = "";
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
answer += s[i];
}
else
{
temp += s[i];
if (temp == "zero")
{
answer += '0';
temp = "";
}
else if (temp == "one")
{
answer += '1';
temp = "";
}
else if (temp == "two")
{
answer += '2';
temp = "";
}
else if (temp == "three")
{
answer += '3';
temp = "";
}
else if (temp == "four")
{
answer += '4';
temp = "";
}
else if (temp == "five")
{
answer += '5';
temp = "";
}
else if (temp == "six")
{
answer += '6';
temp = "";
}
else if (temp == "seven")
{
answer += '7';
temp = "";
}
else if (temp == "eight")
{
answer += '8';
temp = "";
}
else if (temp == "nine")
{
answer += '9';
temp = "";
}
}
}
return stoi(answer);
}[ 해설 ]
#include <string> // string 클래스와 stoi() 함수를 사용하기 위한 헤더
using namespace std; // std::를 생략하기 위해 사용
// 문자열 s를 받아 원래의 숫자로 변환하는 함수
int solution(string s)
{
// 최종적으로 숫자만 저장될 문자열
// 예) "one4seveneight" -> "1478"
string answer = "";
// 영단어를 한 글자씩 모아둘 임시 문자열
// 예) "o" -> "on" -> "one"
string temp = "";
// 문자열의 처음부터 끝까지 한 글자씩 확인
for (int i = 0; i < s.size(); i++)
{
// 현재 문자가 숫자인지 확인
// 문자 '0' ~ '9'의 아스키코드를 이용한 비교
if (s[i] >= '0' && s[i] <= '9')
{
// 숫자라면 그대로 결과 문자열에 추가
// 예)
// answer = "14"
// s[i] = '5'
// 결과 -> "145"
answer += s[i];
}
// 숫자가 아니라면 영어 문자
else
{
// 현재 문자를 temp 문자열 뒤에 추가
// 예)
// temp = "o"
// temp = "on"
// temp = "one"
temp += s[i];
// temp가 "zero"가 되면
if (temp == "zero")
{
// 결과 문자열에 숫자 0 추가
answer += '0';
// 다음 영단어를 저장하기 위해 temp 초기화
temp = "";
}
// temp가 "one"이 되면
else if (temp == "one")
{
// 숫자 1 추가
answer += '1';
// temp 비우기
temp = "";
}
// temp가 "two"가 되면
else if (temp == "two")
{
// 숫자 2 추가
answer += '2';
// temp 비우기
temp = "";
}
// temp가 "three"가 되면
else if (temp == "three")
{
// 숫자 3 추가
answer += '3';
// temp 비우기
temp = "";
}
// temp가 "four"가 되면
else if (temp == "four")
{
// 숫자 4 추가
answer += '4';
// temp 비우기
temp = "";
}
// temp가 "five"가 되면
else if (temp == "five")
{
// 숫자 5 추가
answer += '5';
// temp 비우기
temp = "";
}
// temp가 "six"가 되면
else if (temp == "six")
{
// 숫자 6 추가
answer += '6';
// temp 비우기
temp = "";
}
// temp가 "seven"가 되면
else if (temp == "seven")
{
// 숫자 7 추가
answer += '7';
// temp 비우기
temp = "";
}
// temp가 "eight"가 되면
else if (temp == "eight")
{
// 숫자 8 추가
answer += '8';
// temp 비우기
temp = "";
}
// temp가 "nine"가 되면
else if (temp == "nine")
{
// 숫자 9 추가
answer += '9';
// temp 비우기
temp = "";
}
}
}
// answer에는 숫자로만 이루어진 문자열이 저장되어 있다.
// 예) "1478"
// stoi()를 이용하여 문자열을 정수(int)로 변환한 후 반환한다.
return stoi(answer);
}[ 타 답안 ]
#include <string>
using namespace std;
int solution(string s) {
// 숫자에 해당하는 영단어
string words[10] =
{
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"
};
// 0부터 9까지 반복
for (int i = 0; i < 10; i++)
{
// 영단어가 존재하는 동안 계속 찾기
while (s.find(words[i]) != string::npos)
{
// 찾은 위치의 영단어를 숫자로 변경
s.replace(s.find(words[i]), words[i].length(), to_string(i));
}
}
// 문자열을 정수로 변환하여 반환
return stoi(s);
}